package com.mrjy.common.util;  
/**    
 * @Title: AESUtil.java  
 * @Package   
 * @author csshui
 * @version V1.0    
 */  
import java.security.NoSuchAlgorithmException;  
import java.security.SecureRandom;  
  

import javax.crypto.Cipher;  
import javax.crypto.KeyGenerator;  
import javax.crypto.SecretKey;  
import javax.crypto.spec.SecretKeySpec;  

import org.apache.commons.codec.binary.Hex;
  
public class AESUtil {  
	// 密钥的种子，可以是任何形式，本质是字节数组  
	public static String PRIMARY_KEY = "365jzkt";
	
   /* public static void main(String[] args) {  
        // 密钥数据  
        byte[] rawKey = getRawKey(AESUtil.PRIMARY_KEY.getBytes());  
        // 密码的明文  
        String clearPwd = "365家长课堂测试aes加密";  
        // 密码加密后的密文  
        byte[] encryptedByteArr = encrypt(rawKey, clearPwd);  
        String encryptedPwd = new String(encryptedByteArr);  
        System.out.println(encryptedPwd);  	
        // 解密后的字符串  
        String decryptedPwd = decrypt(encryptedByteArr, rawKey);  
        System.out.println(decryptedPwd);  
  
    }  */
  
    /** 加密
     * @param rawKey 
     *            密钥 
     * @param clearPwd 
     *            明文字符串 
     * @return 密文字节数组 
     */  
    public static String encrypt(byte[] rawKey, String clearPwd) {  
        try {  
            SecretKeySpec secretKeySpec = new SecretKeySpec(rawKey, "AES");  
            Cipher cipher = Cipher.getInstance("AES");  
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);  
            byte[] encypted = cipher.doFinal(clearPwd.getBytes());  
          //密码文Hex编码  
            String encryptResultStr = Hex.encodeHexString(encypted);
            return encryptResultStr;  
        } catch (Exception e) {  
            return null;  
        }  
    }  
  
    /** 解密
     * @param encrypted 
     *            密文字节数组 
     * @param rawKey 
     *            密钥 
     * @return 解密后的字符串 
     */  
    public static String decrypt(String encrypted, byte[] rawKey) {  
        try { 
        	//密文使用Hex解码  
            byte[] content = Hex.decodeHex(encrypted.toCharArray()); 
            SecretKeySpec secretKeySpec = new SecretKeySpec(rawKey, "AES");  
            Cipher cipher = Cipher.getInstance("AES");  
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);  
            byte[] decrypted = cipher.doFinal(content);  
            return new String(decrypted);  
        } catch (Exception e) {  
            return "";  
        }  
    }  
  
    /** 
     * @param seed种子数据 
     * @return 密钥数据 
     */  
    public static byte[] getRawKey(byte[] seed) {  
        byte[] rawKey = null;  
        try {  
            KeyGenerator kgen = KeyGenerator.getInstance("AES");  
            SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");  
            secureRandom.setSeed(seed);  
            // AES加密数据块分组长度必须为128比特，密钥长度可以是128比特、192比特、256比特中的任意一个  
            kgen.init(128, secureRandom);  
            SecretKey secretKey = kgen.generateKey();  
            rawKey = secretKey.getEncoded();  
        } catch (NoSuchAlgorithmException e) {  
        }  
        return rawKey;  
    }  
} 